home *** CD-ROM | disk | FTP | other *** search
/ Utilities Professional 1-1500 / Utilities Professional 1-1500 (1994)(WPD)[!].iso / 12511500 / var1470.dms / var1470.adf / ntsc4ntsc / NTSC4NTSC.mod < prev   
Text File  |  1993-03-23  |  20KB  |  590 lines

  1. (* ------------------------------------------------------------------------
  2.   :Program.       NTSC for NTSC
  3.   :Contents.      get 60 Hz for NTSC screens
  4.   :Author.        Kai Bolay [kai]
  5.   :Address.       Snail-Mail:              E-Mail:
  6.   :Address.       Hoffmannstraße 168       UUCP: kai@amokle.stgt.sub.org
  7.   :Address.       D-7250 Leonberg 1        FIDO: 2:2407/106.3
  8.   :History.       v1.0 [kai] 15-Aug-91 (started written history)
  9.   :History.       v1.1 [kai] 16-Aug-91 (bug fixes)
  10.   :History.       v1.2 [kai] 26-Sep-91 (+ improved stdHeight-handling)
  11.   :History.       v1.3 [kai] 19-Nov-91 (+ autoscroll, force)
  12.   :History.       v1.4 [kai] 14-Dec-91 (+ tried to improve, no success)
  13.   :History.       v1.5 [kai] 19-Jan-92 (+ removed illegal writes)
  14.   :History.       v1.6 [kai] 24-Mar-92 (+ NEWLOOK for all screens)
  15.   :History.       v1.7 [kai] 10-Apr-92 (+ autoscroll only if necessary)
  16.   :History.       v1.8 [kai] 25-Jun-92 (- FreeTagItem()-Bug/v39 fix)
  17.   :History.       v1.9 [kai] 12-Jul-92 (+ ModeNotAvailable() check)
  18.   :History.       v2.0 [kai] 11-Oct-92 (+ PROMOTE)
  19.   :History.       v2.0 [kai] 13-Nov-92 (recompilation)
  20.   :History.       v2.1 [kai] 05-Dec-92 (+ FULLPALETTE, new pens, ext Help)
  21.   :History.       v2.1 [kai] 05-Dec-92 (conditional AddTag(), PROMOTE bug fix)
  22.   :History.       v2.2 [kai] 17-Dec-92 (title may no longer be NIL)
  23.   :History.       v2.2 [kai] 10-Feb-93 (title bug fixed, BORDERBLANK, GFXBASE)
  24.   :History.       v2.2 [kai] 23-Mar-93 (GFXBASE + displayFlags)
  25.   :Copyright.     Freeware
  26.   :Language.      Oberon
  27.   :Translator.    AMIGA OBERON v3.00d
  28.   :Remark.        Thanks to Peter Cherna
  29.   :Remark.        Thanks to Franz Schwarz for telling me a possibility to
  30.   :Remark.        remove illegal writes to the TagList and a lot more...
  31.   :Remark.        NEWLOOK/FULLPALETTE is inspired by Martin Berndt's TagScreens
  32.   :Remark.        GFXBASE inspired by Franz Schwarz's SetNTSC/SetDefMon
  33. ------------------------------------------------------------------------ *)
  34. (* $IF DoIt *)
  35. MODULE NTSC4Debug;
  36. (* $ELSE *)
  37. MODULE NTSC4NTSC;
  38. (* $END *)
  39.  
  40. (* $IF SmallData *) Not possible (* $END *)
  41.  
  42. (* $TypeChk- $OvflChk- $RangeChk- $StackChk- $NilChk- $ReturnChk- $OddChk- $CaseChk- *)
  43.  
  44. IMPORT
  45.   e: Exec, I: Intuition, g: Graphics, u: Utility, d: Dos, y: SYSTEM
  46.   (* $IF DoIt *) ,dio: DebugIo (* $END *);
  47.  
  48. CONST
  49.   OpenScreenOfs = -198;
  50.   OpenScreenTagsOfs = -612;
  51.   (* $IF DoIt *)
  52.   Version = "$VER: NTSC4Debug 2.2 (23.03.93) by Kai Bolay\r\n";
  53.   (* $ELSE *)
  54.   Version = "$VER: NTSC4NTSC 2.2 (23.03.93) by Kai Bolay\r\n";
  55.   (* $END *)
  56.   Template = "STDPAL/S,STDNTSC/S,USEAUTO/S,FORCENTSC/S,NEWLOOK/S,PROMOTE/S,FULLPALETTE/S,BORDERBLANK/S,GFXBASE/S";
  57.   ExtHelp = "\n"
  58.             "STDPAL      use PAL for standard height screens\n"
  59.             "STDNTSC     use NTSC for standard height screens\n"
  60.             "USEAUTO     use NTSC/AUTOSCROLL instead of PAL\n"
  61.             "FORCENTSC   override scrennmode, always use NTSC\n"
  62.             "NEWLOOK     get NEWLOOK screens\n"
  63.             "PROMOTE     use mode promotion\n"
  64.             "FULLPALETTE initialize all colors\n"
  65.             "BORDERBLANK blanks the border around the screen\n"
  66.             "GFXBASE     patches the base of graphics.library\n\n";
  67.   STDPAL      = 0;
  68.   STDNTSC     = 1;
  69.   USEAUTO     = 2;
  70.   FORCENTSC   = 3;
  71.   NEWLOOK     = 4;
  72.   PROMOTE     = 5;
  73.   FULLPALETTE = 6;
  74.   BORDERBLANK = 7;
  75.   GFXBASE     = 8;
  76.   NumOpts     = 9;
  77.   dblpalMonitorID = 0000A1000H; (* v39 *)
  78.   dblntscMonitorID = 000091000H; (* v39 *)
  79. TYPE
  80.   TagArrayPtr = UNTRACED POINTER TO ARRAY MAX (INTEGER) OF u.TagItem;
  81.   ExtNewScreenPtr = UNTRACED POINTER TO I.ExtNewScreen;
  82.   OpenScreenProc = PROCEDURE (newScreen{8}: ExtNewScreenPtr): I.ScreenPtr;
  83.   OpenScreenTagsProc = PROCEDURE (newScreen{8}: I.NewScreenPtr;
  84.                                   paraTagList{9}: TagArrayPtr): I.ScreenPtr;
  85. VAR
  86.   OldOpenScreen: OpenScreenProc;
  87.   OldOpenScreenTags: OpenScreenTagsProc;
  88.   OldNormRows: INTEGER;
  89.   OScanRect: g.Rectangle;
  90.   Opt: ARRAY NumOpts OF e.APTR;
  91.   RD: d.RDArgsPtr;
  92.   StdHeightMonitorID,PALMonitorID, NTSCMonitorID: LONGINT;
  93.   OldNormalDisplayColumns: INTEGER;
  94.   OldNormalDisplayRows: INTEGER;
  95.   OldMonitorID: INTEGER;
  96.   OldDisplayFlags: SET;
  97.   OldVblankFrequency: SHORTINT;
  98.  
  99. PROCEDURE PatchGfxBase;
  100. VAR
  101.   OScanRect: g.Rectangle;
  102. BEGIN
  103.   IF I.QueryOverscan (y.VAL (LONGINT, y.VAL (LONGSET, StdHeightMonitorID) + y.VAL (LONGSET, g.hiresKey)), OScanRect, I.oScanText) # 0 THEN
  104.     e.Disable;
  105.  
  106.     g.base.normalDisplayColumns := OScanRect.maxX - OScanRect.minX + 1;
  107.     g.base.normalDisplayRows := OScanRect.maxY - OScanRect.minY + 1;
  108.  
  109.     (* $OvflChk- *)
  110.     g.base.monitorID := SHORT (y.ROT (y.VAL (LONGINT, y.VAL (LONGSET, StdHeightMonitorID) * y.VAL (LONGSET, g.monitorIDMask)), 16));
  111.     (* $OvflChk= *)
  112.  
  113.     g.base.displayFlags := g.base.displayFlags - {g.pal, g.ntsc};
  114.     IF StdHeightMonitorID = PALMonitorID THEN
  115.       e.exec.vblankFrequency := 50;
  116.       g.base.displayFlags := g.base.displayFlags + {g.pal};
  117.     ELSIF StdHeightMonitorID = NTSCMonitorID THEN
  118.       e.exec.vblankFrequency := 60;
  119.       g.base.displayFlags := g.base.displayFlags + {g.ntsc};
  120.     END;
  121.  
  122.     e.Enable;
  123.   END;
  124. END PatchGfxBase;
  125.  
  126. PROCEDURE BackupGfxBase;
  127. BEGIN
  128.   e.Disable;
  129.   OldNormalDisplayColumns := g.base.normalDisplayColumns;
  130.   OldNormalDisplayRows    := g.base.normalDisplayRows;
  131.   OldMonitorID            := g.base.monitorID;
  132.   OldDisplayFlags         := g.base.displayFlags;
  133.   OldVblankFrequency      := e.exec.vblankFrequency;
  134.   e.Enable;
  135. END BackupGfxBase;
  136.  
  137. PROCEDURE RestoreGfxBase;
  138. BEGIN
  139.   e.Disable;
  140.   g.base.normalDisplayColumns := OldNormalDisplayColumns;
  141.   g.base.normalDisplayRows    := OldNormalDisplayRows;
  142.   g.base.monitorID            := OldMonitorID;
  143.   g.base.displayFlags         := OldDisplayFlags;
  144.   e.exec.vblankFrequency      := OldVblankFrequency;
  145.   e.Enable;
  146. END RestoreGfxBase;
  147.  
  148. (* $Debug- *)
  149. PROCEDURE NewOpenScreenTags* (newScreen{8}: I.NewScreenPtr;
  150.                               paraTagList{9}: TagArrayPtr): I.ScreenPtr;
  151. TYPE
  152.   PenArray = ARRAY 10 OF INTEGER;
  153. CONST
  154.   Pens = PenArray (3,1,1,2,1,3,1,0,2,-1);
  155.   ES = I.EasyStruct (y.SIZE (I.EasyStruct), LONGSET {}, y.ADR ("NTSC4NTSC"),
  156.   y.ADR ("Which Mode should be used for the\nscreen named \"%s\"?"),
  157.   y.ADR ("NTSC|PAL"));
  158.   MaxTags = 10;
  159.   saLikeWorkbench = I.saDummy + 00027H; (* v39 *)
  160. VAR
  161.   Base: I.IntuitionBasePtr;
  162.   TState, Tag, DisplayTag, TypeTag, ScrollTag: u.TagItemPtr;
  163.   Tags: ARRAY MaxTags OF u.TagItem;
  164.   DisplayID: LONGINT;
  165.   OScanRect: g.Rectangle;
  166.   Height: INTEGER;
  167.   Title: e.STRPTR;
  168.   DoScroll, ScrollMagic, Patch: BOOLEAN;
  169.   ListEnd: INTEGER;
  170.   tagList, argTagList: TagArrayPtr;
  171.   scrPtr: I.ScreenPtr;
  172.   TitleStr: ARRAY 40 OF CHAR;
  173.   i: INTEGER;
  174.  
  175.   PROCEDURE GetMonitorID (ID: LONGINT): LONGINT;
  176.   BEGIN
  177.     (* $IF DoIt *)
  178.     dio.WriteString ("GetMonitorID: ");
  179.     dio.WriteHex (y.VAL (LONGINT, y.VAL (LONGSET, ID) *
  180.                          y.VAL (LONGSET, g.monitorIDMask)), 8); dio.WriteLn;
  181.     (* $END *)
  182.     RETURN y.VAL (LONGINT, y.VAL (LONGSET, ID) *
  183.                            y.VAL (LONGSET, g.monitorIDMask));
  184.   END GetMonitorID;
  185.  
  186.   PROCEDURE SetMonitorID (ID: LONGINT; Monitor: LONGINT): LONGINT;
  187.   BEGIN
  188.     (* $IF DoIt *)
  189.     dio.WriteString ("SetMonitorID: ");
  190.     dio.WriteHex (ID, 8); dio.WriteString (" -> ");
  191.     dio.WriteHex (y.VAL (LONGINT, y.VAL (LONGSET, ID) *
  192.         (- y.VAL (LONGSET, g.monitorIDMask))) + Monitor, 8); dio.WriteLn;
  193.     (* $END *)
  194.     RETURN y.VAL (LONGINT, y.VAL (LONGSET, ID) *
  195.                            (- y.VAL (LONGSET, g.monitorIDMask))) + Monitor;
  196.   END SetMonitorID;
  197.  
  198. (* $SaveRegs+ Prepare to work in other tasks *)
  199. BEGIN
  200.   Base := y.REG (14);
  201.  
  202.   (* $IF DoIt *)
  203.   dio.WriteString ("\nHi Folks!\n");
  204.   (* $END *)
  205.  
  206.   ListEnd := 0;
  207.   Height := I.stdScreenHeight;
  208.   ScrollMagic := TRUE; DoScroll := FALSE; Patch := TRUE;
  209.   Title := y.ADR ("");
  210.   DisplayTag := NIL; TypeTag := NIL; ScrollTag := NIL;
  211.  
  212.   IF paraTagList # NIL THEN
  213.     tagList := u.CloneTagItems (paraTagList^);
  214.     IF tagList = NIL THEN
  215.       (* $IF DoIt *)
  216.       dio.WriteString ("No mem to clone!\n");
  217.       (* $END *)
  218.       y.SETREG (14, Base);
  219.       RETURN OldOpenScreenTags (newScreen, paraTagList);
  220.     END;
  221.   ELSE
  222.     tagList := NIL;
  223.   END;
  224.  
  225.   IF newScreen # NIL THEN
  226.     Height := newScreen.height;
  227.     IF newScreen.defaultTitle # NIL THEN
  228.       Title := newScreen.defaultTitle;
  229.     END;
  230.     (* knock out bad bits! *)
  231.     DisplayID := I.UIntToLong (y.VAL (INTEGER, newScreen.viewModes -
  232.       SET {g.sprites, g.genlockAudio, g.genLockVideo, g.extendedMode, g.vpHide}));
  233.  
  234.     (* $IF DoIt *)
  235.     dio.WriteString ("NewScreen gibbet:\n");
  236.     dio.WriteString ("Height: "); dio.WriteInt (Height, 4); dio.WriteLn;
  237.     dio.WriteString ("ViewModes: "); dio.WriteHex (y.VAL (INTEGER, newScreen.viewModes), 4); dio.WriteLn;
  238.     dio.WriteString ("DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  239.     (* $END *)
  240.   END; (* IF *)
  241.  
  242.   IF tagList # NIL THEN
  243.     (* $IF DoIt *)
  244.     dio.WriteString ("Old Tags:\n");
  245.     (* $END *)
  246.     TState := y.ADR (tagList^[0]);
  247.     LOOP
  248.       Tag := u.NextTagItem (TState);
  249.       IF Tag = NIL THEN EXIT END;
  250.       (* $IF DoIt *)
  251.       dio.WriteString ("Tag: "); dio.WriteHex (y.VAL (LONGINT, Tag.tag), 8);
  252.       dio.WriteString (" Data: "); dio.WriteHex (y.VAL (LONGINT, Tag.data), 8); dio.WriteLn;
  253.       (* $END *)
  254.       CASE y.VAL (LONGINT, Tag.tag) OF
  255.       | I.saDisplayID:   DisplayTag := Tag; DisplayID := Tag.data;
  256.       | I.saType:        TypeTag := Tag;
  257.       | I.saAutoScroll:  ScrollTag := Tag;
  258.       | I.saHeight:      Height := SHORT (y.VAL (LONGINT, Tag.data));
  259.       | I.saTitle:       IF Tag.data # NIL THEN Title := Tag.data END;
  260.       | I.saOverscan:    ScrollMagic := FALSE;
  261.       | I.saDClip:       ScrollMagic := FALSE;
  262.       | saLikeWorkbench: Patch := (Tag.data # I.LTRUE);
  263.       ELSE
  264.       END;
  265.     END;
  266.     (* $IF DoIt *)
  267.     dio.WriteString ("Height: "); dio.WriteInt (Height, 4); dio.WriteLn;
  268.     dio.WriteString ("DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  269.     (* $END *)
  270.   END;
  271.  
  272.   IF Opt[PROMOTE] # NIL THEN
  273.     IF GetMonitorID (DisplayID) = g.palMonitorID THEN
  274.       DisplayID := SetMonitorID (DisplayID, dblpalMonitorID);
  275.     END;
  276.     IF GetMonitorID (DisplayID) = g.ntscMonitorID THEN
  277.       DisplayID := SetMonitorID (DisplayID, dblntscMonitorID);
  278.     END;
  279.   END;
  280.  
  281.   (* $IF DoIt *)
  282.   dio.WriteString ("The DisplayID: "); dio.WriteHex (DisplayID, 8); dio.WriteLn;
  283.   (* $END *)
  284.  
  285.   IF Patch THEN
  286.  
  287.     IF Opt[FORCENTSC] # 0 THEN
  288.       DisplayID := SetMonitorID (DisplayID, g.defaultMonitorID);
  289.     END;
  290.  
  291.     IF (GetMonitorID (DisplayID) = g.defaultMonitorID) AND
  292.        (I.QueryOverscan (SetMonitorID (DisplayID, NTSCMonitorID),
  293.                          OScanRect, I.oScanText) # 0) THEN
  294.       (* $IF DoIt *)
  295.       dio.WriteString ("Let's patch: ");
  296.       (* $END *)
  297.       IF Height = I.stdScreenHeight THEN
  298.         (* $IF DoIt *)
  299.         dio.WriteString ("Std-Height\n");
  300.         (* $END *)
  301.         IF StdHeightMonitorID = g.defaultMonitorID THEN
  302.           i := 0;
  303.           WHILE (i < LEN (TitleStr)-4) AND (Title[i] # 0X) DO
  304.             TitleStr[i] := Title[i];
  305.             INC (i);
  306.           END;
  307.           IF Title[i] # 0X THEN
  308.             TitleStr[i] := '.'; INC (i);
  309.             TitleStr[i] := '.'; INC (i);
  310.             TitleStr[i] := '.'; INC (i);
  311.           END;
  312.           TitleStr[i] := 0X;
  313.  
  314.           IF I.EasyRequest (NIL, y.ADR (ES), NIL, y.ADR (TitleStr)) = 1 THEN
  315.             DisplayID := SetMonitorID (DisplayID, NTSCMonitorID);
  316.           ELSE
  317.             DisplayID := SetMonitorID (DisplayID, PALMonitorID);
  318.           END;
  319.         ELSE
  320.           DisplayID := SetMonitorID (DisplayID, StdHeightMonitorID);
  321.         END;
  322.       ELSE
  323.         IF (Height <= OScanRect.maxY - OScanRect.minY + 1) AND (Opt[STDPAL] = 0) THEN
  324.           (* $IF DoIt *)
  325.           dio.WriteString ("NTSC\n");
  326.           (* $END *)
  327.           DisplayID := SetMonitorID (DisplayID, NTSCMonitorID);
  328.         ELSE
  329.           IF (Opt[USEAUTO] = 0) THEN
  330.             (* $IF DoIt *)
  331.             dio.WriteString ("PAL\n");
  332.             (* $END *)
  333.              DisplayID := SetMonitorID (DisplayID, PALMonitorID);
  334.           ELSE
  335.             DoScroll :=  NOT (Height <= OScanRect.maxY - OScanRect.minY + 1);
  336.             DisplayID := SetMonitorID (DisplayID, NTSCMonitorID);
  337.           END;
  338.         END;
  339.       END;
  340.     END; (* IF DefaultMonitorID *)
  341.  
  342.     IF Opt[NEWLOOK] # 0 THEN
  343.       IF (tagList = NIL) OR (u.FindTagItem (I.saPens, tagList^) = NIL) THEN
  344.         (* $IF DoIt *)
  345.         dio.WriteString ("made new!\n");
  346.         (* $END *)
  347.         Tags[ListEnd].tag := I.saPens; Tags[ListEnd].data := y.ADR (Pens);
  348.         INC (ListEnd);
  349.       END;
  350.     END; (* IF *)
  351.     IF Opt[FULLPALETTE] # 0 THEN
  352.       IF (tagList = NIL) OR (u.FindTagItem (I.saFullPalette, tagList^) = NIL) THEN
  353.         (* $IF DoIt *)
  354.         dio.WriteString ("made full!\n");
  355.         (* $END *)
  356.         Tags[ListEnd].tag := I.saFullPalette; Tags[ListEnd].data := I.LTRUE;
  357.         INC (ListEnd);
  358.       END;
  359.     END; (* IF *)
  360.  
  361.     IF DisplayTag # NIL THEN
  362.       (* $IF DoIt *)
  363.       dio.WriteString ("ab in den DispTag!\n");
  364.       (* $END *)
  365.       DisplayTag.data := DisplayID;
  366.     ELSE
  367.       Tags[ListEnd].tag := I.saDisplayID; Tags[ListEnd].data := DisplayID;
  368.       INC (ListEnd);
  369.     END;
  370.     IF DoScroll THEN
  371.       (* $IF DoIt *)
  372.       dio.WriteString ("Schkroll!!\n");
  373.       (* $END *)
  374.       IF (TypeTag = NIL) AND (ScrollTag = NIL) THEN
  375.         Tags[ListEnd].tag := I.saAutoScroll; Tags[ListEnd].data := I.LTRUE;
  376.         INC (ListEnd);
  377.       ELSE
  378.         IF TypeTag # NIL THEN
  379.           TypeTag.data := y.VAL (LONGINT, y.VAL (LONGSET, TypeTag.data) +
  380.                                           LONGSET {I.autoScroll});
  381.         END;
  382.         IF ScrollTag # NIL THEN
  383.           ScrollTag.data := I.LTRUE;
  384.         END;
  385.       END;
  386.       IF ScrollMagic THEN
  387.         Tags[ListEnd].tag := I.saOverscan; Tags[ListEnd].data := I.oScanText;
  388.         INC (ListEnd);
  389.       END;
  390.     END;
  391.   (* $IF DoIt *)
  392.   ELSE
  393.     dio.WriteString ("It's a WB!\n");
  394.   (* $END *)
  395.   END;
  396.  
  397.   IF ListEnd > 0 THEN
  398.     (* $IF DoIt *)
  399.     dio.WriteString ("New Tags:\n");
  400.     i := 0;
  401.     WHILE i < ListEnd DO
  402.       dio.WriteString ("Tag: "); dio.WriteHex (y.VAL (LONGINT, Tags[i].tag), 8);
  403.       dio.WriteString (" Data: "); dio.WriteHex (y.VAL (LONGINT, Tags[i].data), 8); dio.WriteLn;
  404.       INC (i);
  405.     END; (* WHILE *)
  406.     (* $END *)
  407.     IF tagList = NIL THEN
  408.       (* $IF DoIt *)
  409.       dio.WriteString ("New Tags alone!\n");
  410.       (* $END *)
  411.       Tags[ListEnd].tag := u.done; Tags[ListEnd].data := 0;
  412.       INC (ListEnd);
  413.     ELSE
  414.       (* $IF DoIt *)
  415.       dio.WriteString ("New & old Tags!\n");
  416.       (* $END *)
  417.       Tags[ListEnd].tag := u.more; Tags[ListEnd].data := tagList;
  418.       INC (ListEnd);
  419.     END;
  420.     argTagList := y.ADR (Tags);
  421.   ELSE
  422.     (* $IF DoIt *)
  423.     dio.WriteString ("Old Tags alone!\n");
  424.     (* $END *)
  425.     argTagList := tagList;
  426.   END;
  427.  
  428.   (* $IF DoIt *)
  429.   d.Delay (3*50);
  430.   (* $END *)
  431.  
  432.   y.SETREG (14, Base);
  433.   scrPtr := OldOpenScreenTags (newScreen, argTagList);
  434.   IF tagList # NIL THEN
  435.     u.FreeTagItems (tagList^);
  436.   END;
  437.  
  438.   IF Opt[BORDERBLANK] # 0 THEN
  439.     IF scrPtr # NIL THEN
  440.       IF g.VideoControlTagList (scrPtr^.viewPort.colorMap,
  441.                                 g.vTagBorderBlankSet, -1, u.done) THEN END;
  442.       g.MakeVPort (y.ADR (I.base.viewLord), y.ADR (scrPtr^.viewPort));
  443.       g.MrgCop (y.ADR (I.base.viewLord));
  444.     END;
  445.   END;
  446.  
  447.   y.SETREG (14, Base);
  448.   RETURN scrPtr;
  449. END NewOpenScreenTags;
  450.  
  451. PROCEDURE NewOpenScreen* (newScreen{8}: ExtNewScreenPtr): I.ScreenPtr;
  452. VAR
  453.   Base: I.IntuitionBasePtr;
  454.   nScrPtr: I.NewScreenPtr;
  455.   scrPtr: I.ScreenPtr;
  456.  
  457. (* $SaveRegs+ Prepare to work in other tasks *)
  458. BEGIN
  459.   Base := y.REG (14);
  460.   (* $IF DoIt *)
  461.   dio.WriteString ("\nMäthschick (StdOpenScreen)!!!");
  462.   (* $END *)
  463.   (* Do the magic *)
  464.   IF (I.nsExtended IN newScreen.ns.type) THEN
  465.     nScrPtr := e.AllocVec (y.SIZE (I.NewScreen), LONGSET {});
  466.     IF nScrPtr = NIL THEN
  467.       y.SETREG (14, Base);
  468.       RETURN OldOpenScreen (newScreen);
  469.     END;
  470.     e.CopyMem (newScreen^, nScrPtr^, y.SIZE (I.NewScreen));
  471.     EXCL (nScrPtr.type, I.nsExtended);
  472.     y.SETREG (14, Base);
  473.     scrPtr := NewOpenScreenTags (nScrPtr,
  474.                                  y.VAL (TagArrayPtr, newScreen.extension));
  475.     e.FreeVec (nScrPtr);
  476.     y.SETREG (14, Base);
  477.     RETURN scrPtr;
  478.   ELSE
  479.     y.SETREG (14, Base);
  480.     RETURN NewOpenScreenTags (newScreen, NIL);
  481.   END;
  482. END NewOpenScreen;
  483. (* $Debug= *)
  484.  
  485. BEGIN
  486.   (* $IF DoIt *)
  487.   dio.OpenIo;
  488.   dio.WriteString ("Jappadappaduuu!\n");
  489.   (* $END *)
  490.   (* 2.04 should be :-) *)
  491.   IF I.int.libNode.version < 37 THEN
  492.     IF d.Output () # NIL THEN
  493.       y.SETREG (0, d.Write (d.Output (), "Sorry, I need OS 2.04!\n", 23));
  494.     END;
  495.     HALT (20);
  496.   END;
  497.  
  498.   BackupGfxBase;
  499.  
  500.   Opt[STDPAL] := 0; Opt[STDNTSC] := 0; Opt[USEAUTO] := 0;
  501.   Opt[FORCENTSC] := 0; Opt[NEWLOOK] := 0; Opt[PROMOTE] := 0;
  502.  
  503.   RD := d.AllocDosObject (d.rdArgs, NIL);
  504.   IF RD # NIL THEN RD.extHelp := y.ADR (ExtHelp) END;
  505.   IF (RD = NIL) OR (d.ReadArgs (Template, Opt, RD) = NIL) THEN
  506.     d.PrintF ("%s\nUsage: %s\n%s", y.ADR (Version[6]), y.ADR (Template), y.ADR (ExtHelp));
  507.     HALT (20);
  508.   END; (* IF *)
  509.   IF (Opt[FORCENTSC] # 0) THEN
  510.     Opt[STDNTSC] := -1;
  511.     Opt[USEAUTO] := -1;
  512.   END;
  513.   IF (Opt[STDPAL] # 0) AND (Opt[STDNTSC] # 0) THEN
  514.     y.SETREG (0, d.PutStr ("Sorry, PAL & NTSC together is not possible!\n"));
  515.     HALT (20);
  516.   END;
  517.   IF (Opt[GFXBASE] # 0) AND NOT ((Opt[STDPAL] # 0) OR (Opt[STDNTSC] # 0)) THEN
  518.     y.SETREG (0, d.PutStr ("GFXBASE needs PAL or NTSC!\n"));
  519.     HALT (20);
  520.   END;
  521.   IF Opt[PROMOTE] # 0 THEN
  522.     IF I.int.libNode.version < 39 THEN
  523.       y.SETREG (0, d.PutStr ("Promotion needs v39!\n"));
  524.       HALT (20);
  525.     END;
  526.     PALMonitorID := dblpalMonitorID;
  527.     NTSCMonitorID := dblntscMonitorID;
  528.   ELSE
  529.     PALMonitorID := g.palMonitorID;
  530.     NTSCMonitorID := g.ntscMonitorID;
  531.   END;
  532.   IF Opt[STDPAL] # 0 THEN StdHeightMonitorID := PALMonitorID END;
  533.   IF Opt[STDNTSC] # 0 THEN StdHeightMonitorID := NTSCMonitorID END;
  534.  
  535.   (* NTSC & PAL available? *)
  536.   IF (g.FindDisplayInfo (PALMonitorID) = NIL) OR
  537.      (g.ModeNotAvailable (PALMonitorID) # 0) OR
  538.      (g.FindDisplayInfo (NTSCMonitorID) = NIL) OR
  539.      (g.ModeNotAvailable (NTSCMonitorID) # 0) THEN
  540.     y.SETREG (0, d.PutStr ("Sorry, (DBL)PAL & (DBL)NTSC must be available!\n"));
  541.     HALT (20);
  542.   END;
  543.  
  544.   (* Patch *)
  545.   IF (Opt[GFXBASE] # 0) THEN PatchGfxBase END;
  546.  
  547.   e.Forbid;
  548.   OldOpenScreen := y.VAL (OpenScreenProc,
  549.                           e.SetFunction (I.int, OpenScreenOfs,
  550.                                          y.VAL (e.PROC, NewOpenScreen)));
  551.   OldOpenScreenTags := y.VAL (OpenScreenTagsProc,
  552.                               e.SetFunction (I.int, OpenScreenTagsOfs,
  553.                                              y.VAL (e.PROC, NewOpenScreenTags)));
  554.   e.Permit;
  555.  
  556.   (* Wait for Break *)
  557.   y.SETREG (0, e.Wait (LONGSET {d.ctrlC})); (* ... *)
  558.  
  559.   (* Unpatch *)
  560.   e.Forbid;
  561.   OldOpenScreen := y.VAL (OpenScreenProc,
  562.                           e.SetFunction (I.int, OpenScreenOfs,
  563.                                          y.VAL (e.PROC, OldOpenScreen)));
  564.   OldOpenScreenTags := y.VAL (OpenScreenTagsProc,
  565.                               e.SetFunction (I.int, OpenScreenTagsOfs,
  566.                                              y.VAL (e.PROC, OldOpenScreenTags)));
  567.   e.Permit;
  568.   IF (y.VAL (y.ADDRESS, OldOpenScreen)     # y.VAL (y.ADDRESS, NewOpenScreen)    ) OR
  569.      (y.VAL (y.ADDRESS, OldOpenScreenTags) # y.VAL (y.ADDRESS, NewOpenScreenTags)) THEN
  570.     IF I.DisplayAlert (I.recoveryAlert,
  571.                        "\x00\x10\x10Someone else patched too. Safety cannot be guarateed, please reboot!\o\n\x00\x10\x1A     -> Reboot <-                           -> Hope and pray <-     \o\o",
  572.                        40) THEN
  573.       e.ColdReboot;
  574.     END;
  575.   END;
  576.   RestoreGfxBase;
  577.   (* $IF DoIt *)
  578.   dio.CloseIo;
  579.   (* $END *)
  580. CLOSE
  581.   IF RD # NIL THEN
  582.     d.FreeArgs (RD);
  583.     d.FreeDosObject (d.rdArgs, RD); RD := NIL;
  584.   END;
  585. (* $IF DoIt *)
  586. END NTSC4Debug.
  587. (* $ELSE *)
  588. END NTSC4NTSC.
  589. (* $END *)
  590.